home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!seismo!ut-sally!im4u!rutgers!mit-eddie!uw-beaver!tektronix!tekgen!tekred!games-request
- From: games-request@tekred.TEK.COM
- Newsgroups: comp.sources.games
- Subject: v02i037: dungeon - game of adventure, Part04/14
- Message-ID: <1560@tekred.TEK.COM>
- Date: 1 Sep 87 20:18:39 GMT
- Sender: billr@tekred.TEK.COM
- Lines: 2653
- Approved: billr@tekred.TEK.COM
-
- Submitted by: Bill Randle <games-request@tekred.TEK.COM>
- Comp.sources.games: Volume 2, Issue 37
- Archive-name: dungeon/Part04
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 4 (of 7)."
- # Contents: clock.h dverb2.F gdt.F lex.c nobjs.F sverbs.F
- # Wrapped by billr@tekred on Tue Apr 21 10:24:29 1987
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f clock.h -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"clock.h\"
- else
- echo shar: Extracting \"clock.h\" \(339 characters\)
- sed "s/^X//" >clock.h <<'END_OF_clock.h'
- XC
- XC CLOCK INTERRUPTS
- XC
- X LOGICAL CFLAG
- X COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
- XC
- X COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND,
- X& CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG,
- X& CEVGNO,CEVBUC,CEVSPH,CEVEGH,
- X& CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE,
- X& CEVMRS,CEVPIN,CEVINQ,CEVFOL
- X INTEGER EQC(25,2)
- X EQUIVALENCE (CTICK, EQC)
- END_OF_clock.h
- if test 339 -ne `wc -c <clock.h`; then
- echo shar: \"clock.h\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f dverb2.F -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"dverb2.F\"
- else
- echo shar: Extracting \"dverb2.F\" \(10970 characters\)
- sed "s/^X//" >dverb2.F <<'END_OF_dverb2.F'
- XC SAVE- SAVE GAME STATE
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE SAVEGM
- X IMPLICIT INTEGER (A-Z)
- X#include "parser.h"
- X#include "gamestate.h"
- X#include "state.h"
- X#include "screen.h"
- X#include "puzzle.h"
- X#include "rooms.h"
- X#include "exits.h"
- X#include "objects.h"
- X#include "clock.h"
- X#include "villians.h"
- X#include "advers.h"
- X#include "flags.h"
- XC
- XC MISCELLANEOUS VARIABLES
- XC
- X COMMON /VERS/ VMAJ,VMIN,VEDIT
- X COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC
- XC
- X PRSWON=.FALSE.
- XC !DISABLE GAME.
- XC Note: save file format is different for PDP vs. non-PDP versions
- XC
- X#ifdef PDP
- XC
- XC send restore data flag down pipe
- XC
- X call outstr(stchr,1)
- X
- XC write out necessary common blocks
- XC
- XC /play/
- X call arywt(4,winner)
- XC
- XC /state/
- X call arywt(11,moves)
- XC
- XC /screen/
- X call arywt(3,formdr)
- XC
- XC /puzzle/
- X call arywt(64,cpvec)
- XC
- XC /vers/
- X call arywt(3,vmaj)
- XC
- XC /rooms/
- X call arywt(400,rval)
- XC
- XC /objects/
- X call arywt(2860,odesc1)
- XC
- XC /cevent/
- X call arywt(100,ctick)
- XC
- XC /hack/
- X call arywt(8,thfpos)
- XC
- XC /vill/
- X call arywt(4,vprob)
- XC
- XC /advs/
- X call arywt(28,aroom)
- XC
- XC /findex/
- X call arywt(114,flags)
- XC
- XC send end of data flag down pipe
- XC
- X call outstr(endchr,1)
- X CALL RSPEAK(597)
- X RETURN
- X#else
- X OPEN (UNIT=1,file='dsave.dat',ACCESS='SEQUENTIAL',
- X& status='UNKNOWN',FORM='UNFORMATTED',ERR=100)
- XC
- X CALL GTTIME(I)
- XC !GET TIME.
- X WRITE(1) VMAJ,VMIN,VEDIT
- X WRITE(1) WINNER,HERE,THFPOS,TELFLG,THFFLG,THFACT,
- X& SWDACT,SWDSTA,CPVEC
- X WRITE(1) I,MOVES,DEATHS,RWSCOR,EGSCOR,MXLOAD,
- X& LTSHFT,BLOC,MUNGRM,HS,FROMDR,SCOLRM,SCOLAC
- X WRITE(1) ODESC1,ODESC2,OFLAG1,OFLAG2,OFVAL,OTVAL,
- X& OSIZE,OCAPAC,OROOM,OADV,OCAN
- X WRITE(1) RVAL,RFLAG
- X WRITE(1) AROOM,ASCORE,AVEHIC,ASTREN,AFLAG
- X WRITE(1) FLAGS,SWITCH,VPROB,CFLAG,CTICK
- XC
- X CLOSE(UNIT=1)
- X CALL RSPEAK(597)
- X RETURN
- XC
- X100 CALL RSPEAK(598)
- XC !CANT DO IT.
- X RETURN
- X#endif PDP
- X END
- XC RESTORE- RESTORE GAME STATE
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE RSTRGM
- X IMPLICIT INTEGER (A-Z)
- X#include "parser.h"
- X#include "gamestate.h"
- X#include "state.h"
- X#include "screen.h"
- X#include "puzzle.h"
- X#include "rooms.h"
- X#include "exits.h"
- X#include "objects.h"
- X#include "clock.h"
- X#include "villians.h"
- X#include "advers.h"
- X#include "flags.h"
- XC
- XC MISCELLANEOUS VARIABLES
- XC
- X COMMON /VERS/ VMAJ,VMIN,VEDIT
- X COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC
- XC
- X PRSWON=.FALSE.
- XC !DISABLE GAME.
- XC Note: save file format is different for PDP vs. non-PDP versions
- XC
- X#ifdef PDP
- XC
- XC read in necessary common blocks
- XC
- XC /play/
- X call aryrd(4,winner)
- XC
- XC /state/
- X call aryrd(11,moves)
- XC
- XC /screen/
- X call aryrd(3,formdr)
- XC
- XC /puzzle/
- X call aryrd(64,cpvec)
- XC
- XC /vers/
- X call intrd(i)
- X call intrd(j)
- X call intrd(k)
- XC
- XC /rooms/
- X call aryrd(400,rval)
- XC
- XC /objects/
- X call aryrd(2860,odesc1)
- XC
- XC /cevent/
- X call aryrd(100,ctick)
- XC
- XC /hack/
- X call aryrd(8,thfpos)
- XC
- XC /vill/
- X call aryrd(4,vprob)
- XC
- XC /advs/
- X call aryrd(28,aroom)
- XC
- XC /findex/
- X call aryrd(114,flags)
- XC
- X
- XC
- X IF(or((I.NE.VMAJ),(J.NE.VMIN))) GO TO 200
- X CALL RSPEAK(599)
- X RETURN
- XC
- X200 CALL RSPEAK(600)
- XC !OBSOLETE VERSION
- X RETURN
- X#else
- X OPEN (UNIT=1,file='dsave.dat',ACCESS='SEQUENTIAL',
- X& status='OLD',FORM='UNFORMATTED',ERR=100)
- XC
- X READ(1) I,J,K
- X IF(or((I.NE.VMAJ),(J.NE.VMIN))) GO TO 200
- XC
- X READ(1) WINNER,HERE,THFPOS,TELFLG,THFFLG,THFACT,
- X& SWDACT,SWDSTA,CPVEC
- X READ(1) PLTIME,MOVES,DEATHS,RWSCOR,EGSCOR,MXLOAD,
- X& LTSHFT,BLOC,MUNGRM,HS,FROMDR,SCOLRM,SCOLAC
- X READ(1) ODESC1,ODESC2,OFLAG1,OFLAG2,OFVAL,OTVAL,
- X& OSIZE,OCAPAC,OROOM,OADV,OCAN
- X READ(1) RVAL,RFLAG
- X READ(1) AROOM,ASCORE,AVEHIC,ASTREN,AFLAG
- X READ(1) FLAGS,SWITCH,VPROB,CFLAG,CTICK
- XC
- X CLOSE(UNIT=1)
- X CALL RSPEAK(599)
- X RETURN
- XC
- X100 CALL RSPEAK(598)
- XC !CANT DO IT.
- X RETURN
- XC
- X200 CALL RSPEAK(600)
- XC !OBSOLETE VERSION
- X CLOSE (UNIT=1)
- X RETURN
- X#endif PDP
- X END
- XC WALK- MOVE IN SPECIFIED DIRECTION
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION WALK(X)
- X IMPLICIT INTEGER(A-Z)
- X LOGICAL FINDXT,QOPEN,LIT,PROB,MOVETO,RMDESC
- X#include "parser.h"
- X#include "gamestate.h"
- X#include "rooms.h"
- X#include "rflag.h"
- X#include "curxt.h"
- X#include "xsrch.h"
- X#include "objects.h"
- X#include "oflags.h"
- X#include "clock.h"
- X
- X#include "villians.h"
- X#include "advers.h"
- X#include "flags.h"
- XC
- XC FUNCTIONS AND DATA
- XC
- X QOPEN(O)=and(OFLAG2(O),OPENBT).NE.0
- XC WALK, PAGE 2
- XC
- X WALK=.TRUE.
- XC !ASSUME WINS.
- X IF((WINNER.NE.PLAYER).OR.LIT(HERE).OR.PROB(25,25))
- X& GO TO 500
- X IF(.NOT.FINDXT(PRSO,HERE)) GO TO 450
- XC !INVALID EXIT? GRUE
- XC !
- X GO TO (400,200,100,300),XTYPE
- XC !DECODE EXIT TYPE.
- X CALL BUG(9,XTYPE)
- XC
- X100 IF(CXAPPL(XACTIO).NE.0) GO TO 400
- XC !CEXIT... RETURNED ROOM?
- X IF(FLAGS(XFLAG)) GO TO 400
- XC !NO, FLAG ON?
- X200 CALL JIGSUP(523)
- XC !BAD EXIT, GRUE
- XC !
- X RETURN
- XC
- X300 IF(CXAPPL(XACTIO).NE.0) GO TO 400
- XC !DOOR... RETURNED ROOM?
- X IF(QOPEN(XOBJ)) GO TO 400
- XC !NO, DOOR OPEN?
- X CALL JIGSUP(523)
- XC !BAD EXIT, GRUE
- XC !
- X RETURN
- XC
- X400 IF(LIT(XROOM1)) GO TO 900
- XC !VALID ROOM, IS IT LIT?
- X450 CALL JIGSUP(522)
- XC !NO, GRUE
- XC !
- X RETURN
- XC
- XC ROOM IS LIT, OR WINNER IS NOT PLAYER (NO GRUE).
- XC
- X500 IF(FINDXT(PRSO,HERE)) GO TO 550
- XC !EXIT EXIST?
- X525 XSTRNG=678
- XC !ASSUME WALL.
- X IF(PRSO.EQ.XUP) XSTRNG=679
- XC !IF UP, CANT.
- X IF(PRSO.EQ.XDOWN) XSTRNG=680
- XC !IF DOWN, CANT.
- X IF(and(RFLAG(HERE),RNWALL).NE.0) XSTRNG=524
- X CALL RSPEAK(XSTRNG)
- X PRSCON=1
- XC !STOP CMD STREAM.
- X RETURN
- XC
- X550 GO TO (900,600,700,800),XTYPE
- XC !BRANCH ON EXIT TYPE.
- X CALL BUG(9,XTYPE)
- XC
- X700 IF(CXAPPL(XACTIO).NE.0) GO TO 900
- XC !CEXIT... RETURNED ROOM?
- X IF(FLAGS(XFLAG)) GO TO 900
- XC !NO, FLAG ON?
- X600 IF(XSTRNG.EQ.0) GO TO 525
- XC !IF NO REASON, USE STD.
- X CALL RSPEAK(XSTRNG)
- XC !DENY EXIT.
- X PRSCON=1
- XC !STOP CMD STREAM.
- X RETURN
- XC
- X800 IF(CXAPPL(XACTIO).NE.0) GO TO 900
- XC !DOOR... RETURNED ROOM?
- X IF(QOPEN(XOBJ)) GO TO 900
- XC !NO, DOOR OPEN?
- X IF(XSTRNG.EQ.0) XSTRNG=525
- XC !IF NO REASON, USE STD.
- X CALL RSPSUB(XSTRNG,ODESC2(XOBJ))
- X PRSCON=1
- XC !STOP CMD STREAM.
- X RETURN
- XC
- X900 WALK=MOVETO(XROOM1,WINNER)
- XC !MOVE TO ROOM.
- X IF(WALK) WALK=RMDESC(0)
- XC !DESCRIBE ROOM.
- X RETURN
- X END
- XC CXAPPL- CONDITIONAL EXIT PROCESSORS
- XC
- XC DECLARATIONS
- XC
- X INTEGER FUNCTION CXAPPL(RI)
- X IMPLICIT INTEGER (A-Z)
- X#include "gamestate.h"
- X#include "parser.h"
- X#include "puzzle.h"
- X#include "rooms.h"
- X#include "rindex.h"
- X#include "exits.h"
- X#include "curxt.h"
- X#include "xpars.h"
- X#include "xsrch.h"
- X#include "objects.h"
- X#include "oflags.h"
- X#include "oindex.h"
- X#include "advers.h"
- X#include "flags.h"
- XC CXAPPL, PAGE 2
- XC
- X CXAPPL=0
- XC !NO RETURN.
- X IF(RI.EQ.0) RETURN
- XC !IF NO ACTION, DONE.
- X GO TO (1000,2000,3000,4000,5000,6000,7000,
- X& 8000,9000,10000,11000,12000,13000,14000),RI
- X CALL BUG(5,RI)
- XC
- XC C1- COFFIN-CURE
- XC
- X1000 EGYPTF=OADV(COFFI).NE.WINNER
- XC !T IF NO COFFIN.
- X RETURN
- XC
- XC C2- CAROUSEL EXIT
- XC C5- CAROUSEL OUT
- XC
- X2000 IF(CAROFF) RETURN
- XC !IF FLIPPED, NOTHING.
- X2500 CALL RSPEAK(121)
- XC !SPIN THE COMPASS.
- X5000 I=XELNT(XCOND)*RND(8)
- XC !CHOOSE RANDOM EXIT.
- X XROOM1=and(TRAVEL(REXIT(HERE)+I),XRMASK)
- X CXAPPL=XROOM1
- XC !RETURN EXIT.
- X RETURN
- XC
- XC C3- CHIMNEY FUNCTION
- XC
- X3000 LITLDF=.FALSE.
- XC !ASSUME HEAVY LOAD.
- X J=0
- X DO 3100 I=1,OLNT
- XC !COUNT OBJECTS.
- X IF(OADV(I).EQ.WINNER) J=J+1
- X3100 CONTINUE
- XC
- X IF(J.GT.2) RETURN
- XC !CARRYING TOO MUCH?
- X XSTRNG=446
- XC !ASSUME NO LAMP.
- X IF(OADV(LAMP).NE.WINNER) RETURN
- XC !NO LAMP?
- X LITLDF=.TRUE.
- XC !HE CAN DO IT.
- X IF(and(OFLAG2(DOOR),OPENBT).EQ.0)
- X& OFLAG2(DOOR)=and(OFLAG2(DOOR), not(TCHBT))
- X RETURN
- XC
- XC C4- FROBOZZ FLAG (MAGNET ROOM, FAKE EXIT)
- XC C6- FROBOZZ FLAG (MAGNET ROOM, REAL EXIT)
- XC
- X4000 IF(CAROFF) GO TO 2500
- XC !IF FLIPPED, GO SPIN.
- X FROBZF=.FALSE.
- XC !OTHERWISE, NOT AN EXIT.
- X RETURN
- XC
- X6000 IF(CAROFF) GO TO 2500
- XC !IF FLIPPED, GO SPIN.
- X FROBZF=.TRUE.
- XC !OTHERWISE, AN EXIT.
- X RETURN
- XC
- XC C7- FROBOZZ FLAG (BANK ALARM)
- XC
- X7000 FROBZF=and((OROOM(BILLS).NE.0),(OROOM(PORTR).NE.0))
- X RETURN
- XC CXAPPL, PAGE 3
- XC
- XC C8- FROBOZZ FLAG (MRGO)
- XC
- X8000 FROBZF=.FALSE.
- XC !ASSUME CANT MOVE.
- X IF(MLOC.NE.XROOM1) GO TO 8100
- XC !MIRROR IN WAY?
- X IF((PRSO.EQ.XNORTH).OR.(PRSO.EQ.XSOUTH)) GO TO 8200
- X IF(MOD(MDIR,180).NE.0) GO TO 8300
- XC !MIRROR MUST BE N-S.
- X XROOM1=((XROOM1-MRA)*2)+MRAE
- XC !CALC EAST ROOM.
- X IF(PRSO.GT.XSOUTH) XROOM1=XROOM1+1
- XC !IF SW/NW, CALC WEST.
- X8100 CXAPPL=XROOM1
- X RETURN
- XC
- X8200 XSTRNG=814
- XC !ASSUME STRUC BLOCKS.
- X IF(MOD(MDIR,180).EQ.0) RETURN
- XC !IF MIRROR N-S, DONE.
- X8300 LDIR=MDIR
- XC !SEE WHICH MIRROR.
- X IF(PRSO.EQ.XSOUTH) LDIR=180
- X XSTRNG=815
- XC !MIRROR BLOCKS.
- X IF(((LDIR.GT.180).AND..NOT.MR1F).OR.
- X& ((LDIR.LT.180).AND..NOT.MR2F)) XSTRNG=816
- X RETURN
- XC
- XC C9- FROBOZZ FLAG (MIRIN)
- XC
- X9000 IF(MRHERE(HERE).NE.1) GO TO 9100
- XC !MIRROR 1 HERE?
- X IF(MR1F) XSTRNG=805
- XC !SEE IF BROKEN.
- X FROBZF=MROPNF
- XC !ENTER IF OPEN.
- X RETURN
- XC
- X9100 FROBZF=.FALSE.
- XC !NOT HERE,
- X XSTRNG=817
- XC !LOSE.
- X RETURN
- XC CXAPPL, PAGE 4
- XC
- XC C10- FROBOZZ FLAG (MIRROR EXIT)
- XC
- X10000 FROBZF=.FALSE.
- XC !ASSUME CANT.
- X LDIR=((PRSO-XNORTH)/XNORTH)*45
- XC !XLATE DIR TO DEGREES.
- X IF(.NOT.MROPNF .OR.
- X& ((MOD(MDIR+270,360).NE.LDIR).AND.(PRSO.NE.XEXIT)))
- X& GO TO 10200
- X XROOM1=((MLOC-MRA)*2)+MRAE+1-(MDIR/180)
- XC !ASSUME E-W EXIT.
- X IF(MOD(MDIR,180).EQ.0) GO TO 10100
- XC !IF N-S, OK.
- X XROOM1=MLOC+1
- XC !ASSUME N EXIT.
- X IF(MDIR.GT.180) XROOM1=MLOC-1
- XC !IF SOUTH.
- X10100 CXAPPL=XROOM1
- X RETURN
- XC
- X10200 IF(.NOT.WDOPNF .OR.
- X& ((MOD(MDIR+180,360).NE.LDIR).AND.(PRSO.NE.XEXIT)))
- X& RETURN
- X XROOM1=MLOC+1
- XC !ASSUME N.
- X IF(MDIR.EQ.0) XROOM1=MLOC-1
- XC !IF S.
- X CALL RSPEAK(818)
- XC !CLOSE DOOR.
- X WDOPNF=.FALSE.
- X CXAPPL=XROOM1
- X RETURN
- XC
- XC C11- MAYBE DOOR. NORMAL MESSAGE IS THAT DOOR IS CLOSED.
- XC BUT IF LCELL.NE.4, DOOR ISNT THERE.
- XC
- X11000 IF(LCELL.NE.4) XSTRNG=678
- XC !SET UP MSG.
- X RETURN
- XC
- XC C12- FROBZF (PUZZLE ROOM MAIN ENTRANCE)
- XC
- X12000 FROBZF=.TRUE.
- XC !ALWAYS ENTER.
- X CPHERE=10
- XC !SET SUBSTATE.
- X RETURN
- XC
- XC C13- CPOUTF (PUZZLE ROOM SIZE ENTRANCE)
- XC
- X13000 CPHERE=52
- XC !SET SUBSTATE.
- X RETURN
- XC CXAPPL, PAGE 5
- XC
- XC C14- FROBZF (PUZZLE ROOM TRANSITIONS)
- XC
- X14000 FROBZF=.FALSE.
- XC !ASSSUME LOSE.
- X IF(PRSO.NE.XUP) GO TO 14100
- XC !UP?
- X IF(CPHERE.NE.10) RETURN
- XC !AT EXIT?
- X XSTRNG=881
- XC !ASSUME NO LADDER.
- X IF(CPVEC(CPHERE+1).NE.-2) RETURN
- XC !LADDER HERE?
- X CALL RSPEAK(882)
- XC !YOU WIN.
- X FROBZF=.TRUE.
- XC !LET HIM OUT.
- X RETURN
- XC
- X14100 IF((CPHERE.NE.52).OR.(PRSO.NE.XWEST).OR..NOT.CPOUTF)
- X& GO TO 14200
- X FROBZF=.TRUE.
- XC !YES, LET HIM OUT.
- X RETURN
- XC
- X14200 DO 14300 I=1,16,2
- XC !LOCATE EXIT.
- X IF(PRSO.EQ.CPDR(I)) GO TO 14400
- X14300 CONTINUE
- X RETURN
- XC !NO SUCH EXIT.
- XC
- X14400 J=CPDR(I+1)
- XC !GET DIRECTIONAL OFFSET.
- X NXT=CPHERE+J
- XC !GET NEXT STATE.
- X K=8
- XC !GET ORTHOGONAL DIR.
- X IF(J.LT.0) K=-8
- X IF((((IABS(J).EQ.1).OR.(IABS(J).EQ.8)).OR.
- X& ((CPVEC(CPHERE+K).EQ.0).OR.(CPVEC(NXT-K).EQ.0))).AND.
- X& (CPVEC(NXT).EQ.0)) GO TO 14500
- X RETURN
- XC
- X14500 CALL CPGOTO(NXT)
- XC !MOVE TO STATE.
- X XROOM1=CPUZZ
- XC !STAY IN ROOM.
- X CXAPPL=XROOM1
- X RETURN
- XC
- X END
- END_OF_dverb2.F
- if test 10970 -ne `wc -c <dverb2.F`; then
- echo shar: \"dverb2.F\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f gdt.F -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"gdt.F\"
- else
- echo shar: Extracting \"gdt.F\" \(11509 characters\)
- sed "s/^X//" >gdt.F <<'END_OF_gdt.F'
- XC GDT- GAME DEBUGGING TOOL
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE GDT
- X IMPLICIT INTEGER (A-Z)
- X#ifdef PDP
- XC
- XC no debugging tool available in pdp version
- XC
- X call nogdt
- X return
- X#else
- X CHARACTER*2 DBGCMD(38),CMD
- X INTEGER ARGTYP(38)
- X LOGICAL VALID1,VALID2,VALID3
- X character*2 ldbgcmd(38)
- X#include "parser.h"
- X#include "gamestate.h"
- X#include "state.h"
- X#include "screen.h"
- X#include "puzzle.h"
- XC
- XC MISCELLANEOUS VARIABLES
- XC
- X COMMON /STAR/ MBASE,STRBIT
- X#include "io.h"
- X#include "mindex.h"
- X#include "debug.h"
- X#include "rooms.h"
- X#include "rindex.h"
- X#include "exits.h"
- X#include "objects.h"
- X#include "oindex.h"
- X#include "clock.h"
- X#include "villians.h"
- X#include "advers.h"
- X#include "flags.h"
- XC
- XC FUNCTIONS AND DATA
- XC
- X VALID1(A1,L1)=(A1.GT.0).AND.(A1.LE.L1)
- X VALID2(A1,A2,L1)=VALID1(A1,L1).AND.VALID1(A2,L1).AND.
- X& (A1.LE.A2)
- X VALID3(A1,L1,A2,L2)=VALID1(A1,L1).AND.VALID1(A2,L2)
- X DATA CMDMAX/38/
- X DATA DBGCMD/'DR','DO','DA','DC','DX','DH','DL','DV','DF','DS',
- X& 'AF','HE','NR','NT','NC','ND','RR','RT','RC','RD',
- X& 'TK','EX','AR','AO','AA','AC','AX','AV','D2','DN',
- X& 'AN','DM','DT','AH','DP','PD','DZ','AZ'/
- X DATA ldbgcmd/'dr','do','da','dc','dx','dh','dl','dv','df','ds',
- X& 'af','he','nr','nt','nc','nd','rr','rt','rc','rd',
- X& 'tk','ex','ar','ao','aa','ac','ax','av','d2','dn',
- X& 'an','dm','dt','ah','dp','pd','dz','az'/
- X DATA ARGTYP/ 2 , 2 , 2 , 2 , 2 , 0 , 0 , 2 , 2 , 0 ,
- X& 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
- X& 1 , 0 , 3 , 3 , 3 , 3 , 1 , 3 , 2 , 2 ,
- X& 1 , 2 , 1 , 0 , 0 , 0 , 0 , 1 /
- XC GDT, PAGE 2
- XC
- XC FIRST, VALIDATE THAT THE CALLER IS AN IMPLEMENTER.
- XC
- X FMAX=46
- XC !SET ARRAY LIMITS.
- X SMAX=22
- XC
- X IF(GDTFLG.NE.0) GO TO 2000
- XC !IF OK, SKIP.
- X WRITE(OUTCH,100)
- XC !NOT AN IMPLEMENTER.
- X RETURN
- XC !BOOT HIM OFF
- XC
- X100 FORMAT(' You are not an authorized user.')
- Xc GDT, PAGE 2A
- XC
- XC HERE TO GET NEXT COMMAND
- XC
- X2000 WRITE(OUTCH,200)
- XC !OUTPUT PROMPT.
- X READ(INPCH,210) CMD
- XC !GET COMMAND.
- X IF(CMD.EQ.' ') GO TO 2000
- XC !IGNORE BLANKS.
- X DO 2100 I=1,CMDMAX
- XC !LOOK IT UP.
- X IF(CMD.EQ.DBGCMD(I)) GO TO 2300
- XC !FOUND?
- XC check for lower case command, as well
- X if(cmd .eq. ldbgcmd(i)) go to 2300
- X2100 CONTINUE
- X2200 WRITE(OUTCH,220)
- XC !NO, LOSE.
- X GO TO 2000
- XC
- X200 FORMAT(' GDT>',$)
- X210 FORMAT(A2)
- X220 FORMAT(' ?')
- X230 FORMAT(2I6)
- X240 FORMAT(I6)
- X225 FORMAT(' Limits: ',$)
- X235 FORMAT(' Entry: ',$)
- X245 FORMAT(' Idx,Ary: ',$)
- Xc
- X2300 GO TO (2400,2500,2600,2700),ARGTYP(I)+1
- XC !BRANCH ON ARG TYPE.
- X GO TO 2200
- XC !ILLEGAL TYPE.
- XC
- X2700 WRITE(OUTCH,245)
- XC !TYPE 3, REQUEST ARRAY COORDS.
- X READ(INPCH,230) J,K
- X GO TO 2400
- XC
- X2600 WRITE(OUTCH,225)
- XC !TYPE 2, READ BOUNDS.
- X READ(INPCH,230) J,K
- X IF(K.EQ.0) K=J
- X GO TO 2400
- XC
- X2500 WRITE(OUTCH,235)
- XC !TYPE 1, READ ENTRY NO.
- X READ(INPCH,240) J
- X2400 GO TO (10000,11000,12000,13000,14000,15000,16000,17000,18000,
- X& 19000,20000,21000,22000,23000,24000,25000,26000,27000,28000,
- X& 29000,30000,31000,32000,33000,34000,35000,36000,37000,38000,
- X& 39000,40000,41000,42000,43000,44000,45000,46000,47000),I
- X GO TO 2200
- XC !WHAT???
- XC GDT, PAGE 3
- XC
- XC DR-- DISPLAY ROOMS
- XC
- X10000 IF(.NOT.VALID2(J,K,RLNT)) GO TO 2200
- XC !ARGS VALID?
- X WRITE(OUTCH,300)
- XC !COL HDRS.
- X DO 10100 I=J,K
- X WRITE(OUTCH,310) I,(EQR(I,L),L=1,5)
- X10100 CONTINUE
- X GO TO 2000
- XC
- X300 FORMAT(' RM# DESC1 EXITS ACTION VALUE FLAGS')
- X310 FORMAT(1X,I3,4(1X,I6),1X,I6)
- XC
- XC DO-- DISPLAY OBJECTS
- XC
- X11000 IF(.NOT.VALID2(J,K,OLNT)) GO TO 2200
- XC !ARGS VALID?
- X WRITE(OUTCH,320)
- XC !COL HDRS
- X DO 11100 I=J,K
- X WRITE(OUTCH,330) I,(EQO(I,L),L=1,14)
- X11100 CONTINUE
- X GO TO 2000
- XC
- X320 FORMAT(' OB# DESC1 DESC2 DESCO ACT FLAGS1 FLAGS2 FVL TVL
- X& SIZE CAPAC ROOM ADV CON READ')
- X330 FORMAT(1X,I3,3I6,I4,2I7,2I4,2I6,1X,3I4,I6)
- XC
- XC DA-- DISPLAY ADVENTURERS
- XC
- X12000 IF(.NOT.VALID2(J,K,ALNT)) GO TO 2200
- XC !ARGS VALID?
- X WRITE(OUTCH,340)
- X DO 12100 I=J,K
- X WRITE(OUTCH,350) I,(EQA(I,L),L=1,7)
- X12100 CONTINUE
- X GO TO 2000
- XC
- X340 FORMAT(' AD# ROOM SCORE VEHIC OBJECT ACTION STREN FLAGS')
- X350 FORMAT(1X,I3,6(1X,I6),1X,I6)
- XC
- XC DC-- DISPLAY CLOCK EVENTS
- XC
- X13000 IF(.NOT.VALID2(J,K,CLNT)) GO TO 2200
- XC !ARGS VALID?
- X WRITE(OUTCH,360)
- X DO 13100 I=J,K
- X WRITE(OUTCH,370) I,(EQC(I,L),L=1,2),CFLAG(I)
- X13100 CONTINUE
- X GO TO 2000
- XC
- X360 FORMAT(' CL# TICK ACTION FLAG')
- X370 FORMAT(1X,I3,1X,I6,1X,I6,5X,L1)
- XC
- XC DX-- DISPLAY EXITS
- XC
- X14000 IF(.NOT.VALID2(J,K,XLNT)) GO TO 2200
- XC !ARGS VALID?
- X WRITE(OUTCH,380)
- XC !COL HDRS.
- X DO 14100 I=J,K,10
- XC !TEN PER LINE.
- X L=MIN0(I+9,K)
- XC !COMPUTE END OF LINE.
- X WRITE(OUTCH,390) I,L,(TRAVEL(L1),L1=I,L)
- X14100 CONTINUE
- X GO TO 2000
- XC
- X380 FORMAT(' RANGE CONTENTS')
- X390 FORMAT(1X,I3,'-',I3,3X,10I7)
- XC
- XC DH-- DISPLAY HACKS
- XC
- X15000 WRITE(OUTCH,400) THFPOS,THFFLG,THFACT,SWDACT,SWDSTA
- X GO TO 2000
- XC
- X400 FORMAT(' THFPOS=',I6,', THFFLG=',L2,',THFACT=',L2/
- X& ' SWDACT=',L2,', SWDSTA=',I2)
- XC
- XC DL-- DISPLAY LENGTHS
- XC
- X16000 WRITE(OUTCH,410) RLNT,XLNT,OLNT,CLNT,VLNT,ALNT,MLNT,R2LNT,
- X& MBASE,STRBIT
- X GO TO 2000
- XC
- X410 FORMAT(' R=',I6,', X=',I6,', O=',I6,', C=',I6/
- X& ' V=',I6,', A=',I6,', M=',I6,', R2=',I5/
- X& ' MBASE=',I6,', STRBIT=',I6)
- XC
- XC DV-- DISPLAY VILLAINS
- XC
- X17000 IF(.NOT.VALID2(J,K,VLNT)) GO TO 2200
- XC !ARGS VALID?
- X WRITE(OUTCH,420)
- XC !COL HDRS
- X DO 17100 I=J,K
- X WRITE(OUTCH,430) I,(EQV(I,L),L=1,5)
- X17100 CONTINUE
- X GO TO 2000
- XC
- X420 FORMAT(' VL# OBJECT PROB OPPS BEST MELEE')
- X430 FORMAT(1X,I3,5(1X,I6))
- XC
- XC DF-- DISPLAY FLAGS
- XC
- X18000 IF(.NOT.VALID2(J,K,FMAX)) GO TO 2200
- XC !ARGS VALID?
- X DO 18100 I=J,K
- X WRITE(OUTCH,440) I,FLAGS(I)
- X18100 CONTINUE
- X GO TO 2000
- XC
- X440 FORMAT(' Flag #',I2,' = ',L1)
- XC
- XC DS-- DISPLAY STATE
- XC
- X19000 WRITE(OUTCH,450) PRSA,PRSO,PRSI,PRSWON,PRSCON
- X WRITE(OUTCH,460) WINNER,HERE,TELFLG
- X WRITE(OUTCH,470) MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD,LTSHFT,BLOC,
- X& MUNGRM,HS,EGSCOR,EGMXSC
- X WRITE(OUTCH,475) FROMDR,SCOLRM,SCOLAC
- X GO TO 2000
- XC
- X450 FORMAT(' Parse vector=',3(1X,I6),1X,L6,1X,I6)
- X460 FORMAT(' Play vector= ',2(1X,I6),1X,L6)
- X470 FORMAT(' State vector=',9(1X,I6)/14X,2(1X,I6))
- X475 FORMAT(' Scol vector= ',1X,I6,2(1X,I6))
- XC GDT, PAGE 4
- XC
- XC AF-- ALTER FLAGS
- XC
- X20000 IF(.NOT.VALID1(J,FMAX)) GO TO 2200
- XC !ENTRY NO VALID?
- X WRITE(OUTCH,480) FLAGS(J)
- XC !TYPE OLD, GET NEW.
- X READ(INPCH,490) FLAGS(J)
- X GO TO 2000
- XC
- X480 FORMAT(' Old=',L2,6X,'New= ',$)
- X490 FORMAT(L1)
- XC
- XC 21000-- HELP
- XC
- X21000 WRITE(OUTCH,900)
- X GO TO 2000
- XC
- X900 FORMAT(' Valid commands are:'/' AA- Alter ADVS'/
- X& ' AC- Alter CEVENT'/' AF- Alter FINDEX'/' AH- Alter HERE'/
- X& ' AN- Alter switches'/' AO- Alter OBJCTS'/' AR- Alter ROOMS'/
- X& ' AV- Alter VILLS'/' AX- Alter EXITS'/
- X& ' AZ- Alter PUZZLE'/' DA- Display ADVS'/
- X& ' DC- Display CEVENT'/' DF- Display FINDEX'/' DH- Display HACKS'/
- X& ' DL- Display lengths'/' DM- Display RTEXT'/
- X& ' DN- Display switches'/
- X& ' DO- Display OBJCTS'/' DP- Display parser'/
- X& ' DR- Display ROOMS'/' DS- Display state'/' DT- Display text'/
- X& ' DV- Display VILLS'/' DX- Display EXITS'/' DZ- Display PUZZLE'/
- X& ' D2- Display ROOM2'/' EX- Exit'/' HE- Type this message'/
- X& ' NC- No cyclops'/' ND- No deaths'/' NR- No robber'/
- X& ' NT- No troll'/' PD- Program detail'/
- X& ' RC- Restore cyclops'/' RD- Restore deaths'/
- X& ' RR- Restore robber'/' RT- Restore troll'/' TK- Take.')
- XC
- XC NR-- NO ROBBER
- XC
- X22000 THFFLG=.FALSE.
- XC !DISABLE ROBBER.
- X THFACT=.FALSE.
- X CALL NEWSTA(THIEF,0,0,0,0)
- XC !VANISH THIEF.
- X WRITE(OUTCH,500)
- X GO TO 2000
- XC
- X500 FORMAT(' No robber.')
- XC
- XC NT-- NO TROLL
- XC
- X23000 TROLLF=.TRUE.
- X CALL NEWSTA(TROLL,0,0,0,0)
- X WRITE(OUTCH,510)
- X GO TO 2000
- XC
- X510 FORMAT(' No troll.')
- XC
- XC NC-- NO CYCLOPS
- XC
- X24000 CYCLOF=.TRUE.
- X CALL NEWSTA(CYCLO,0,0,0,0)
- X WRITE(OUTCH,520)
- X GO TO 2000
- XC
- X520 FORMAT(' No cyclops.')
- XC
- XC ND-- IMMORTALITY MODE
- XC
- X25000 DBGFLG=1
- X WRITE(OUTCH,530)
- X GO TO 2000
- XC
- X530 FORMAT(' No deaths.')
- XC
- XC RR-- RESTORE ROBBER
- XC
- X26000 THFACT=.TRUE.
- X WRITE(OUTCH,540)
- X GO TO 2000
- XC
- X540 FORMAT(' Restored robber.')
- XC
- XC RT-- RESTORE TROLL
- XC
- X27000 TROLLF=.FALSE.
- X CALL NEWSTA(TROLL,0,MTROL,0,0)
- X WRITE(OUTCH,550)
- X GO TO 2000
- XC
- X550 FORMAT(' Restored troll.')
- XC
- XC RC-- RESTORE CYCLOPS
- XC
- X28000 CYCLOF=.FALSE.
- X MAGICF=.FALSE.
- X CALL NEWSTA(CYCLO,0,MCYCL,0,0)
- X WRITE(OUTCH,560)
- X GO TO 2000
- XC
- X560 FORMAT(' Restored cyclops.')
- XC
- XC RD-- MORTAL MODE
- XC
- X29000 DBGFLG=0
- X WRITE(OUTCH,570)
- X GO TO 2000
- XC
- X570 FORMAT(' Restored deaths.')
- XC GDT, PAGE 5
- XC
- XC TK-- TAKE
- XC
- X30000 IF(.NOT.VALID1(J,OLNT)) GO TO 2200
- XC !VALID OBJECT?
- X CALL NEWSTA(J,0,0,0,WINNER)
- XC !YES, TAKE OBJECT.
- X WRITE(OUTCH,580)
- XC !TELL.
- X GO TO 2000
- XC
- X580 FORMAT(' Taken.')
- XC
- XC EX-- GOODBYE
- XC
- X31000 PRSCON=1
- X RETURN
- XC
- XC AR-- ALTER ROOM ENTRY
- XC
- X32000 IF(.NOT.VALID3(J,RLNT,K,5)) GO TO 2200
- XC !INDICES VALID?
- X WRITE(OUTCH,590) EQR(J,K)
- XC !TYPE OLD, GET NEW.
- X READ(INPCH,600) EQR(J,K)
- X GO TO 2000
- XC
- X590 FORMAT(' Old= ',I6,6X,'New= ',$)
- X600 FORMAT(I6)
- XC
- XC AO-- ALTER OBJECT ENTRY
- XC
- X33000 IF(.NOT.VALID3(J,OLNT,K,14)) GO TO 2200
- XC !INDICES VALID?
- X WRITE(OUTCH,590) EQO(J,K)
- X READ(INPCH,600) EQO(J,K)
- X GO TO 2000
- XC
- XC AA-- ALTER ADVS ENTRY
- XC
- X34000 IF(.NOT.VALID3(J,ALNT,K,7)) GO TO 2200
- XC !INDICES VALID?
- X WRITE(OUTCH,590) EQA(J,K)
- X READ(INPCH,600) EQA(J,K)
- X GO TO 2000
- XC
- XC AC-- ALTER CLOCK EVENTS
- XC
- X35000 IF(.NOT.VALID3(J,CLNT,K,3)) GO TO 2200
- XC !INDICES VALID?
- X IF(K.EQ.3) GO TO 35500
- XC !FLAGS ENTRY?
- X WRITE(OUTCH,590) EQC(J,K)
- X READ(INPCH,600) EQC(J,K)
- X GO TO 2000
- XC
- X35500 WRITE(OUTCH,480) CFLAG(J)
- X READ(INPCH,490) CFLAG(J)
- X GO TO 2000
- XC GDT, PAGE 6
- XC
- XC AX-- ALTER EXITS
- XC
- X36000 IF(.NOT.VALID1(J,XLNT)) GO TO 2200
- XC !ENTRY NO VALID?
- X WRITE(OUTCH,610) TRAVEL(J)
- X READ(INPCH,620) TRAVEL(J)
- X GO TO 2000
- XC
- X610 FORMAT(' Old= ',I6,6X,'New= ',$)
- X620 FORMAT(I6)
- XC
- XC AV-- ALTER VILLAINS
- XC
- X37000 IF(.NOT.VALID3(J,VLNT,K,5)) GO TO 2200
- XC !INDICES VALID?
- X WRITE(OUTCH,590) EQV(J,K)
- X READ(INPCH,600) EQV(J,K)
- X GO TO 2000
- XC
- XC D2-- DISPLAY ROOM2 LIST
- XC
- X38000 IF(.NOT.VALID2(J,K,R2LNT)) GO TO 2200
- X DO 38100 I=J,K
- X WRITE(OUTCH,630) I,RROOM2(I),OROOM2(I)
- X38100 CONTINUE
- X GO TO 2000
- XC
- X630 FORMAT(' #',I2,' Room=',I6,' Obj=',I6)
- XC
- XC DN-- DISPLAY SWITCHES
- XC
- X39000 IF(.NOT.VALID2(J,K,SMAX)) GO TO 2200
- XC !VALID?
- X DO 39100 I=J,K
- X WRITE(OUTCH,640) I,SWITCH(I)
- X39100 CONTINUE
- X GO TO 2000
- XC
- X640 FORMAT(' Switch #',I2,' = ',I6)
- XC
- XC AN-- ALTER SWITCHES
- XC
- X40000 IF(.NOT.VALID1(J,SMAX)) GO TO 2200
- XC !VALID ENTRY?
- X WRITE(OUTCH,590) SWITCH(J)
- X READ(INPCH,600) SWITCH(J)
- X GO TO 2000
- XC
- XC DM-- DISPLAY MESSAGES
- XC
- X41000 IF(.NOT.VALID2(J,K,MLNT)) GO TO 2200
- XC !VALID LIMITS?
- X WRITE(OUTCH,380)
- X DO 41100 I=J,K,10
- X L=MIN0(I+9,K)
- X WRITE(OUTCH,650) I,L,(RTEXT(L1),L1=I,L)
- X41100 CONTINUE
- X GO TO 2000
- XC
- X650 FORMAT(1X,I3,'-',I3,3X,10(1X,I6))
- XC
- XC DT-- DISPLAY TEXT
- XC
- X42000 CALL RSPEAK(J)
- X GO TO 2000
- XC
- XC AH-- ALTER HERE
- XC
- X43000 WRITE(OUTCH,590) HERE
- X READ(INPCH,600) HERE
- X EQA(1,1)=HERE
- X GO TO 2000
- XC
- XC DP-- DISPLAY PARSER STATE
- XC
- X44000 WRITE(OUTCH,660) ORP,LASTIT,PVEC,SYN
- X GO TO 2000
- XC
- X660 FORMAT(' ORPHS= ',I7,I7,4I7/
- X& ' PV= ',I7,4I7/' SYN= ',6I7/15X,5I7)
- XC
- XC PD-- PROGRAM DETAIL DEBUG
- XC
- X45000 WRITE(OUTCH,610) PRSFLG
- XC !TYPE OLD, GET NEW.
- X READ(INPCH,620) PRSFLG
- X GO TO 2000
- XC
- XC DZ-- DISPLAY PUZZLE ROOM
- XC
- X46000 DO 46100 I=1,64,8
- XC !DISPLAY PUZZLE
- X WRITE(OUTCH,670) (CPVEC(J),J=I,I+7)
- X46100 CONTINUE
- X GO TO 2000
- XC
- X670 FORMAT(2X,8I3)
- XC
- XC AZ-- ALTER PUZZLE ROOM
- XC
- X47000 IF(.NOT.VALID1(J,64)) GO TO 2200
- XC !VALID ENTRY?
- X WRITE(OUTCH,590) CPVEC(J)
- XC !OUTPUT OLD,
- X READ(INPCH,600) CPVEC(J)
- X GO TO 2000
- XC
- X#endif PDP
- X END
- END_OF_gdt.F
- if test 11509 -ne `wc -c <gdt.F`; then
- echo shar: \"gdt.F\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f lex.c -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"lex.c\"
- else
- echo shar: Extracting \"lex.c\" \(1532 characters\)
- sed "s/^X//" >lex.c <<'END_OF_lex.c'
- X#define FALSE 0
- X#define TRUE 1
- X
- Xlex_(inbuf, inlnt, outbuf, op, vbflag, lprscon)
- X char inbuf[78];
- X int outbuf[40], *inlnt, *op, *vbflag;
- X int *lprscon; /* added */
- X{
- X /*
- X * lex - lexical analyzer, converted from fortran
- X *
- X * input: one line of ascii characters
- X * output: tokenized input, packed in radix-50 format
- X */
- X
- X char j;
- X int cp, i, k, prsptr;
- X static int num601 = {601};
- X
- X for (i=0; i<40; i++)
- X outbuf[i] = 0;
- X *op = -1;
- X prsptr = *lprscon - 1;
- X /* printf("lex: inbuf=%s, inlnt=%d\n", inbuf, *inlnt); */
- X
- Xtoknlp:
- X *op += 2;
- X cp = 0;
- X while ((*lprscon)++ <= *inlnt) {
- X j = inbuf[prsptr++];
- X /* printf("lex: chr=%c\n", j); */
- X if ((j == '.') || (j == ','))
- X break;
- X else if (j == ' ')
- X if (cp) /* if (cp != 0) */
- X goto toknlp;
- X else
- X continue; /* first token */
- X else if ((j >= 'A') && (j <= 'Z'))
- X j -= '@';
- X else if (((j >= '1') && (j <= '9')) || (j == '-'))
- X j -= 0x0c; /* formfeed */
- X else {
- X if (*vbflag)
- X rspeak_(&num601);
- X return(FALSE);
- X }
- X
- X if (cp >= 6)
- X /*
- X * ignore remainder of any token > 6 chars
- X */
- X continue;
- X /*
- X * pack three chars per word in radix-50 format
- X */
- X k = *op + (cp/3) - 1;
- X /* printf("*op=%d, cp=%d, k=%d\n", *op, cp, k); */
- X switch (cp%3) {
- X case 0:
- X outbuf[k] += j * 1560;
- X case 1:
- X outbuf[k] += j * 39;
- X case 2:
- X outbuf[k] += j;
- X }
- X cp++;
- X }
- X if (*lprscon > *inlnt)
- X *lprscon = 1;
- X if (!cp) /* if (cp == 0) */
- X if (*op == 1)
- X return(FALSE); /* no valid tokens */
- X else {
- X *op -= 2;
- X return(TRUE);
- X };
- X}
- END_OF_lex.c
- if test 1532 -ne `wc -c <lex.c`; then
- echo shar: \"lex.c\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f nobjs.F -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"nobjs.F\"
- else
- echo shar: Extracting \"nobjs.F\" \(13027 characters\)
- sed "s/^X//" >nobjs.F <<'END_OF_nobjs.F'
- XC NOBJS- NEW OBJECTS PROCESSOR
- XC OBJECTS IN THIS MODULE CANNOT CALL RMINFO, JIGSUP,
- XC MAJOR VERBS, OR OTHER NON-RESIDENT SUBROUTINES
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION NOBJS(RI,ARG)
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL QOPEN,MOVETO,F
- X LOGICAL QHERE,OPNCLS,MIRPAN
- X#include "parser.h"
- X#include "gamestate.h"
- X#include "state.h"
- X#include "screen.h"
- X#include "puzzle.h"
- XC
- XC MISCELLANEOUS VARIABLES
- XC
- X COMMON /HYPER/ HFACTR
- X#include "rooms.h"
- X#include "rflag.h"
- X#include "rindex.h"
- X#include "objects.h"
- X#include "oflags.h"
- X#include "oindex.h"
- X#include "clock.h"
- X
- X#include "villians.h"
- X#include "advers.h"
- X#include "verbs.h"
- X#include "flags.h"
- XC
- XC FUNCTIONS AND DATA
- XC
- X QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
- XC NOBJS, PAGE 2
- XC
- X IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
- X IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
- X AV=AVEHIC(WINNER)
- X NOBJS=.TRUE.
- XC
- X GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,
- X& 10000,11000,12000,13000,14000,15000,16000,17000,
- X& 18000,19000,20000,21000),
- X& (RI-31)
- X CALL BUG(6,RI)
- XC
- XC RETURN HERE TO DECLARE FALSE RESULT
- XC
- X10 NOBJS=.FALSE.
- X RETURN
- XC
- XC O32-- BILLS
- XC
- X1000 IF(PRSA.NE.EATW) GO TO 1100
- XC !EAT?
- X CALL RSPEAK(639)
- XC !JOKE.
- X RETURN
- XC
- X1100 IF(PRSA.EQ.BURNW) CALL RSPEAK(640)
- XC !BURN? JOKE.
- X GO TO 10
- XC !LET IT BE HANDLED.
- XC NOBJS, PAGE 3
- XC
- XC O33-- SCREEN OF LIGHT
- XC
- X2000 TARGET=SCOL
- XC !TARGET IS SCOL.
- X2100 IF(PRSO.NE.TARGET) GO TO 2400
- XC !PRSO EQ TARGET?
- X IF((PRSA.NE.PUSHW).AND.(PRSA.NE.MOVEW).AND.
- X& (PRSA.NE.TAKEW).AND.(PRSA.NE.RUBW)) GO TO 2200
- X CALL RSPEAK(673)
- XC !HAND PASSES THRU.
- X RETURN
- XC
- X2200 IF((PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW).AND.
- X& (PRSA.NE.MUNGW)) GO TO 2400
- X CALL RSPSUB(674,ODI2)
- XC !PASSES THRU.
- X RETURN
- XC
- X2400 IF((PRSA.NE.THROWW).OR.(PRSI.NE.TARGET)) GO TO 10
- X IF(HERE.EQ.BKBOX) GO TO 2600
- XC !THRU SCOL?
- X CALL NEWSTA(PRSO,0,BKBOX,0,0)
- XC !NO, THRU WALL.
- X CALL RSPSUB(675,ODO2)
- XC !ENDS UP IN BOX ROOM.
- X CTICK(CEVSCL)=0
- XC !CANCEL ALARM.
- X SCOLRM=0
- XC !RESET SCOL ROOM.
- X RETURN
- XC
- X2600 IF(SCOLRM.EQ.0) GO TO 2900
- XC !TRIED TO GO THRU?
- X CALL NEWSTA(PRSO,0,SCOLRM,0,0)
- XC !SUCCESS.
- X CALL RSPSUB(676,ODO2)
- XC !ENDS UP SOMEWHERE.
- X CTICK(CEVSCL)=0
- XC !CANCEL ALARM.
- X SCOLRM=0
- XC !RESET SCOL ROOM.
- X RETURN
- XC
- X2900 CALL RSPEAK(213)
- XC !CANT DO IT.
- X RETURN
- XC NOBJS, PAGE 4
- XC
- XC O34-- GNOME OF ZURICH
- XC
- X3000 IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 3200
- X IF(OTVAL(PRSO).NE.0) GO TO 3100
- XC !THROW A TREASURE?
- X CALL NEWSTA(PRSO,641,0,0,0)
- XC !NO, GO POP.
- X RETURN
- XC
- X3100 CALL NEWSTA(PRSO,0,0,0,0)
- XC !YES, BYE BYE TREASURE.
- X CALL RSPSUB(642,ODO2)
- X CALL NEWSTA(ZGNOM,0,0,0,0)
- XC !BYE BYE GNOME.
- X CTICK(CEVZGO)=0
- XC !CANCEL EXIT.
- X F=MOVETO(BKENT,WINNER)
- XC !NOW IN BANK ENTRANCE.
- X RETURN
- XC
- X3200 IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
- X& (PRSA.NE.MUNGW)) GO TO 3300
- X CALL NEWSTA(ZGNOM,643,0,0,0)
- XC !VANISH GNOME.
- X CTICK(CEVZGO)=0
- XC !CANCEL EXIT.
- X RETURN
- XC
- X3300 CALL RSPEAK(644)
- XC !GNOME IS IMPATIENT.
- X RETURN
- XC
- XC O35-- EGG
- XC
- X4000 IF((PRSA.NE.OPENW).OR.(PRSO.NE.EGG)) GO TO 4500
- X IF(.NOT.QOPEN(EGG)) GO TO 4100
- XC !OPEN ALREADY?
- X CALL RSPEAK(649)
- XC !YES.
- X RETURN
- XC
- X4100 IF(PRSI.NE.0) GO TO 4200
- XC !WITH SOMETHING?
- X CALL RSPEAK(650)
- XC !NO, CANT.
- X RETURN
- XC
- X4200 IF(PRSI.NE.HANDS) GO TO 4300
- XC !WITH HANDS?
- X CALL RSPEAK(651)
- XC !NOT RECOMMENDED.
- X RETURN
- XC
- X4300 I=652
- XC !MUNG MESSAGE.
- X IF((and(OFLAG1(PRSI),TOOLBT).NE.0).OR.
- X& (and(OFLAG2(PRSI),WEAPBT).NE.0)) GO TO 4600
- X I=653
- XC !NOVELTY 1.
- X IF(and(OFLAG2(PRSO),FITEBT).NE.0) I=654
- X OFLAG2(PRSO)=or(OFLAG2(PRSO),FITEBT)
- X CALL RSPSUB(I,ODI2)
- X RETURN
- XC
- X4500 IF((PRSA.NE.OPENW).AND.(PRSA.NE.MUNGW)) GO TO 4800
- X I=655
- XC !YOU BLEW IT.
- X4600 CALL NEWSTA(BEGG,I,OROOM(EGG),OCAN(EGG),OADV(EGG))
- X CALL NEWSTA(EGG,0,0,0,0)
- XC !VANISH EGG.
- X OTVAL(BEGG)=2
- XC !BAD EGG HAS VALUE.
- X IF(OCAN(CANAR).NE.EGG) GO TO 4700
- XC !WAS CANARY INSIDE?
- X CALL RSPEAK(ODESCO(BCANA))
- XC !YES, DESCRIBE RESULT.
- X OTVAL(BCANA)=1
- X RETURN
- XC
- X4700 CALL NEWSTA(BCANA,0,0,0,0)
- XC !NO, VANISH IT.
- X RETURN
- XC
- X4800 IF((PRSA.NE.DROPW).OR.(HERE.NE.MTREE)) GO TO 10
- X CALL NEWSTA(BEGG,658,FORE3,0,0)
- XC !DROPPED EGG.
- X CALL NEWSTA(EGG,0,0,0,0)
- X OTVAL(BEGG)=2
- X IF(OCAN(CANAR).NE.EGG) GO TO 4700
- X OTVAL(BCANA)=1
- XC !BAD CANARY.
- X RETURN
- XC NOBJS, PAGE 5
- XC
- XC O36-- CANARIES, GOOD AND BAD
- XC
- X5000 IF(PRSA.NE.WINDW) GO TO 10
- XC !WIND EM UP?
- X IF(PRSO.EQ.CANAR) GO TO 5100
- XC !RIGHT ONE?
- X CALL RSPEAK(645)
- XC !NO, BAD NEWS.
- X RETURN
- XC
- X5100 IF(.NOT.SINGSF.AND.((HERE.EQ.MTREE).OR.
- X& ((HERE.GE.FORE1).AND.(HERE.LT.CLEAR))))
- X& GO TO 5200
- X CALL RSPEAK(646)
- XC !NO, MEDIOCRE NEWS.
- X RETURN
- XC
- X5200 SINGSF=.TRUE.
- XC !SANG SONG.
- X I=HERE
- X IF(I.EQ.MTREE) I=FORE3
- XC !PLACE BAUBLE.
- X CALL NEWSTA(BAUBL,647,I,0,0)
- X RETURN
- XC
- XC O37-- WHITE CLIFFS
- XC
- X6000 IF((PRSA.NE.CLMBW).AND.(PRSA.NE.CLMBUW).AND.
- X& (PRSA.NE.CLMBDW)) GO TO 10
- X CALL RSPEAK(648)
- XC !OH YEAH?
- X RETURN
- XC
- XC O38-- WALL
- XC
- X7000 IF((IABS(HERE-MLOC).NE.1).OR.(MRHERE(HERE).NE.0).OR.
- X& (PRSA.NE.PUSHW)) GO TO 7100
- X CALL RSPEAK(860)
- XC !PUSHED MIRROR WALL.
- X RETURN
- XC
- X7100 IF(and(RFLAG(HERE),RNWALL).EQ.0) GO TO 10
- X CALL RSPEAK(662)
- XC !NO WALL.
- X RETURN
- XC NOBJS, PAGE 6
- XC
- XC O39-- SONG BIRD GLOBAL
- XC
- X8000 IF(PRSA.NE.FINDW) GO TO 8100
- XC !FIND?
- X CALL RSPEAK(666)
- X RETURN
- XC
- X8100 IF(PRSA.NE.EXAMIW) GO TO 10
- XC !EXAMINE?
- X CALL RSPEAK(667)
- X RETURN
- XC
- XC O40-- PUZZLE/SCOL WALLS
- XC
- X9000 IF(HERE.NE.CPUZZ) GO TO 9500
- XC !PUZZLE WALLS?
- X IF(PRSA.NE.PUSHW) GO TO 10
- XC !PUSH?
- X DO 9100 I=1,8,2
- XC !LOCATE WALL.
- X IF(PRSO.EQ.CPWL(I)) GO TO 9200
- X9100 CONTINUE
- X CALL BUG(80,PRSO)
- XC !WHAT?
- XC
- X9200 J=CPWL(I+1)
- XC !GET DIRECTIONAL OFFSET.
- X NXT=CPHERE+J
- XC !GET NEXT STATE.
- X WL=CPVEC(NXT)
- XC !GET C(NEXT STATE).
- X GO TO (9300,9300,9300,9250,9350),(WL+4)
- XC !PROCESS.
- XC
- X9250 CALL RSPEAK(876)
- XC !CLEAR CORRIDOR.
- X RETURN
- XC
- X9300 IF(CPVEC(NXT+J).EQ.0) GO TO 9400
- XC !MOVABLE, ROOM TO MOVE?
- X9350 CALL RSPEAK(877)
- XC !IMMOVABLE, NO ROOM.
- X RETURN
- XC
- X9400 I=878
- XC !ASSUME FIRST PUSH.
- X IF(CPUSHF) I=879
- XC !NOT?
- X CPUSHF=.TRUE.
- X CPVEC(NXT+J)=WL
- XC !MOVE WALL.
- X CPVEC(NXT)=0
- XC !VACATE NEXT STATE.
- X CALL CPGOTO(NXT)
- XC !ONWARD.
- X CALL CPINFO(I,NXT)
- XC !DESCRIBE.
- X CALL PRINCR(.TRUE.,HERE)
- XC !PRINT ROOMS CONTENTS.
- X RFLAG(HERE)=or(RFLAG(HERE),RSEEN)
- X RETURN
- XC
- X9500 IF(HERE.NE.SCOLAC) GO TO 9700
- XC !IN SCOL ACTIVE ROOM?
- X DO 9600 I=1,12,3
- X TARGET=SCOLWL(I+1)
- XC !ASSUME TARGET.
- X IF(SCOLWL(I).EQ.HERE) GO TO 2100
- XC !TREAT IF FOUND.
- X9600 CONTINUE
- XC
- X9700 IF(HERE.NE.BKBOX) GO TO 10
- XC !IN BOX ROOM?
- X TARGET=WNORT
- X GO TO 2100
- XC NOBJS, PAGE 7
- XC
- XC O41-- SHORT POLE
- XC
- X10000 IF(PRSA.NE.RAISEW) GO TO 10100
- XC !LIFT?
- X I=749
- XC !ASSUME UP.
- X IF(POLEUF.EQ.2) I=750
- XC !ALREADY UP?
- X CALL RSPEAK(I)
- X POLEUF=2
- XC !POLE IS RAISED.
- X RETURN
- XC
- X10100 IF((PRSA.NE.LOWERW).AND.(PRSA.NE.PUSHW)) GO TO 10
- X IF(POLEUF.NE.0) GO TO 10200
- XC !ALREADY LOWERED?
- X CALL RSPEAK(751)
- XC !CANT DO IT.
- X RETURN
- XC
- X10200 IF(MOD(MDIR,180).NE.0) GO TO 10300
- XC !MIRROR N-S?
- X POLEUF=0
- XC !YES, LOWER INTO
- X CALL RSPEAK(752)
- XC !CHANNEL.
- X RETURN
- XC
- X10300 IF((MDIR.NE.270).OR.(MLOC.NE.MRB)) GO TO 10400
- X POLEUF=0
- XC !LOWER INTO HOLE.
- X CALL RSPEAK(753)
- X RETURN
- XC
- X10400 CALL RSPEAK(753+POLEUF)
- XC !POLEUF = 1 OR 2.
- X POLEUF=1
- XC !NOW ON FLOOR.
- X RETURN
- XC
- XC O42-- MIRROR SWITCH
- XC
- X11000 IF(PRSA.NE.PUSHW) GO TO 10
- XC !PUSH?
- X IF(MRPSHF) GO TO 11300
- XC !ALREADY PUSHED?
- X CALL RSPEAK(756)
- XC !BUTTON GOES IN.
- X DO 11100 I=1,OLNT
- XC !BLOCKED?
- X IF(QHERE(I,MREYE).AND.(I.NE.RBEAM)) GO TO 11200
- X11100 CONTINUE
- X CALL RSPEAK(757)
- XC !NOTHING IN BEAM.
- X RETURN
- XC
- X11200 CFLAG(CEVMRS)=.TRUE.
- XC !MIRROR OPENS.
- X CTICK(CEVMRS)=7
- X MRPSHF=.TRUE.
- X MROPNF=.TRUE.
- X RETURN
- XC
- X11300 CALL RSPEAK(758)
- XC !MIRROR ALREADYOPEN.
- X RETURN
- XC NOBJS, PAGE 8
- XC
- XC O43-- BEAM FUNCTION
- XC
- X12000 IF((PRSA.NE.TAKEW).OR.(PRSO.NE.RBEAM)) GO TO 12100
- X CALL RSPEAK(759)
- XC !TAKE BEAM, JOKE.
- X RETURN
- XC
- X12100 I=PRSO
- XC !ASSUME BLK WITH DIROBJ.
- X IF((PRSA.EQ.PUTW).AND.(PRSI.EQ.RBEAM)) GO TO 12200
- X IF((PRSA.NE.MUNGW).OR.(PRSO.NE.RBEAM).OR.
- X& (PRSI.EQ.0)) GO TO 10
- X I=PRSI
- X12200 IF(OADV(I).NE.WINNER) GO TO 12300
- XC !CARRYING?
- X CALL NEWSTA(I,0,HERE,0,0)
- XC !DROP OBJ.
- X CALL RSPSUB(760,ODESC2(I))
- X RETURN
- XC
- X12300 J=761
- XC !ASSUME NOT IN ROOM.
- X IF(QHERE(J,HERE)) I=762
- XC !IN ROOM?
- X CALL RSPSUB(J,ODESC2(I))
- XC !DESCRIBE.
- X RETURN
- XC
- XC O44-- BRONZE DOOR
- XC
- X13000 IF((HERE.EQ.NCELL).OR.((LCELL.EQ.4).AND.
- X& ((HERE.EQ.CELL).OR.(HERE.EQ.SCORR))))
- X& GO TO 13100
- X CALL RSPEAK(763)
- XC !DOOR NOT THERE.
- X RETURN
- XC
- X13100 IF(.NOT.OPNCLS(ODOOR,764,765)) GO TO 10
- XC !OPEN/CLOSE?
- X IF((HERE.EQ.NCELL).AND.QOPEN(ODOOR))
- X& CALL RSPEAK(766)
- X RETURN
- XC
- XC O45-- QUIZ DOOR
- XC
- X14000 IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 14100
- X CALL RSPEAK(767)
- XC !DOOR WONT MOVE.
- X RETURN
- XC
- X14100 IF(PRSA.NE.KNOCKW) GO TO 10
- XC !KNOCK?
- X IF(INQSTF) GO TO 14200
- XC !TRIED IT ALREADY?
- X INQSTF=.TRUE.
- XC !START INQUISITION.
- X CFLAG(CEVINQ)=.TRUE.
- X CTICK(CEVINQ)=2
- X QUESNO=RND(8)
- XC !SELECT QUESTION.
- X NQATT=0
- X CORRCT=0
- X CALL RSPEAK(768)
- XC !ANNOUNCE RULES.
- X CALL RSPEAK(769)
- X CALL RSPEAK(770+QUESNO)
- XC !ASK QUESTION.
- X RETURN
- XC
- X14200 CALL RSPEAK(798)
- XC !NO REPLY.
- X RETURN
- XC
- XC O46-- LOCKED DOOR
- XC
- X15000 IF(PRSA.NE.OPENW) GO TO 10
- XC !OPEN?
- X CALL RSPEAK(778)
- XC !CANT.
- X RETURN
- XC
- XC O47-- CELL DOOR
- XC
- X16000 NOBJS=OPNCLS(CDOOR,779,780)
- XC !OPEN/CLOSE?
- X RETURN
- XC NOBJS, PAGE 9
- XC
- XC O48-- DIALBUTTON
- XC
- X17000 IF(PRSA.NE.PUSHW) GO TO 10
- XC !PUSH?
- X CALL RSPEAK(809)
- XC !CLICK.
- X IF(QOPEN(CDOOR)) CALL RSPEAK(810)
- XC !CLOSE CELL DOOR.
- XC
- X DO 17100 I=1,OLNT
- XC !RELOCATE OLD TO HYPER.
- X IF((OROOM(I).EQ.CELL).AND.(and(OFLAG1(I),DOORBT).EQ.0))
- X& CALL NEWSTA(I,0,LCELL*HFACTR,0,0)
- X IF(OROOM(I).EQ.(PNUMB*HFACTR))
- X& CALL NEWSTA(I,0,CELL,0,0)
- X17100 CONTINUE
- XC
- X OFLAG2(ODOOR)=and(OFLAG2(ODOOR), not(OPENBT))
- X OFLAG2(CDOOR)=and(OFLAG2(CDOOR), not(OPENBT))
- X OFLAG1(ODOOR)=and(OFLAG1(ODOOR), not(VISIBT))
- X IF(PNUMB.EQ.4) OFLAG1(ODOOR)=or(OFLAG1(ODOOR),VISIBT)
- XC
- X IF(AROOM(PLAYER).NE.CELL) GO TO 17400
- XC !PLAYER IN CELL?
- X IF(LCELL.NE.4) GO TO 17200
- XC !IN RIGHT CELL?
- X OFLAG1(ODOOR)=or(OFLAG1(ODOOR), VISIBT)
- X F=MOVETO(NCELL,PLAYER)
- XC !YES, MOVETO NCELL.
- X GO TO 17400
- X17200 F=MOVETO(PCELL,PLAYER)
- XC !NO, MOVETO PCELL.
- XC
- X17400 LCELL=PNUMB
- X RETURN
- XC NOBJS, PAGE 10
- XC
- XC O49-- DIAL INDICATOR
- XC
- X18000 IF(PRSA.NE.SPINW) GO TO 18100
- XC !SPIN?
- X PNUMB=RND(8)+1
- XC !WHEE
- XC !
- X CALL RSPSUB(797,712+PNUMB)
- X RETURN
- XC
- X18100 IF((PRSA.NE.MOVEW).AND.(PRSA.NE.PUTW).AND.
- X& (PRSA.NE.TRNTOW)) GO TO 10
- X IF(PRSI.NE.0) GO TO 18200
- XC !TURN DIAL TO X?
- X CALL RSPEAK(806)
- XC !MUST SPECIFY.
- X RETURN
- XC
- X18200 IF((PRSI.GE.NUM1).AND.(PRSI.LE.NUM8)) GO TO 18300
- X CALL RSPEAK(807)
- XC !MUST BE DIGIT.
- X RETURN
- XC
- X18300 PNUMB=PRSI-NUM1+1
- XC !SET UP NEW.
- X CALL RSPSUB(808,712+PNUMB)
- X RETURN
- XC
- XC O50-- GLOBAL MIRROR
- XC
- X19000 NOBJS=MIRPAN(832,.FALSE.)
- X RETURN
- XC
- XC O51-- GLOBAL PANEL
- XC
- X20000 IF(HERE.NE.FDOOR) GO TO 20100
- XC !AT FRONT DOOR?
- X IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
- X CALL RSPEAK(843)
- XC !PANEL IN DOOR, NOGO.
- X RETURN
- XC
- X20100 NOBJS=MIRPAN(838,.TRUE.)
- X RETURN
- XC
- XC O52-- PUZZLE ROOM SLIT
- XC
- X21000 IF((PRSA.NE.PUTW).OR.(PRSI.NE.CSLIT)) GO TO 10
- X IF(PRSO.NE.GCARD) GO TO 21100
- XC !PUT CARD IN SLIT?
- X CALL NEWSTA(PRSO,863,0,0,0)
- XC !KILL CARD.
- X CPOUTF=.TRUE.
- XC !OPEN DOOR.
- X OFLAG1(STLDR)=and(OFLAG1(STLDR),not(VISIBT))
- X RETURN
- XC
- X21100 IF((and(OFLAG1(PRSO),VICTBT).EQ.0).AND.
- X& (and(OFLAG2(PRSO),VILLBT).EQ.0)) GO TO 21200
- X CALL RSPEAK(RND(5)+552)
- XC !JOKE FOR VILL, VICT.
- X RETURN
- XC
- X21200 CALL NEWSTA(PRSO,0,0,0,0)
- XC !KILL OBJECT.
- X CALL RSPSUB(864,ODO2)
- XC !DESCRIBE.
- X RETURN
- XC
- X END
- XC MIRPAN-- PROCESSOR FOR GLOBAL MIRROR/PANEL
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION MIRPAN(ST,PNF)
- X IMPLICIT INTEGER(A-Z)
- X LOGICAL PNF
- X#include "gamestate.h"
- X#include "parser.h"
- X#include "verbs.h"
- X#include "flags.h"
- XC MIRPAN, PAGE 2
- XC
- X MIRPAN=.TRUE.
- X NUM=MRHERE(HERE)
- XC !GET MIRROR NUM.
- X IF(NUM.NE.0) GO TO 100
- XC !ANY HERE?
- X CALL RSPEAK(ST)
- XC !NO, LOSE.
- X RETURN
- XC
- X100 MRBF=0
- XC !ASSUME MIRROR OK.
- X IF(((NUM.EQ.1).AND..NOT.MR1F).OR.
- X& ((NUM.EQ.2).AND..NOT.MR2F)) MRBF=1
- X IF((PRSA.NE.MOVEW).AND.(PRSA.NE.OPENW)) GO TO 200
- X CALL RSPEAK(ST+1)
- XC !CANT OPEN OR MOVE.
- X RETURN
- XC
- X200 IF(PNF.OR.((PRSA.NE.LOOKIW).AND.(PRSA.NE.EXAMIW).AND.
- X& (PRSA.NE.LOOKW))) GO TO 300
- X CALL RSPEAK(844+MRBF)
- XC !LOOK IN MIRROR.
- X RETURN
- XC
- X300 IF(PRSA.NE.MUNGW) GO TO 400
- XC !BREAK?
- X CALL RSPEAK(ST+2+MRBF)
- XC !DO IT.
- X IF((NUM.EQ.1).AND..NOT.PNF) MR1F=.FALSE.
- X IF((NUM.EQ.2).AND..NOT.PNF) MR2F=.FALSE.
- X RETURN
- XC
- X400 IF(PNF.OR.(MRBF.EQ.0)) GO TO 500
- XC !BROKEN MIRROR?
- X CALL RSPEAK(846)
- X RETURN
- XC
- X500 IF(PRSA.NE.PUSHW) GO TO 600
- XC !PUSH?
- X CALL RSPEAK(ST+3+NUM)
- X RETURN
- XC
- X600 MIRPAN=.FALSE.
- XC !CANT HANDLE IT.
- X RETURN
- XC
- X END
- END_OF_nobjs.F
- if test 13027 -ne `wc -c <nobjs.F`; then
- echo shar: \"nobjs.F\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f sverbs.F -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"sverbs.F\"
- else
- echo shar: Extracting \"sverbs.F\" \(13200 characters\)
- sed "s/^X//" >sverbs.F <<'END_OF_sverbs.F'
- XC SVERBS- SIMPLE VERBS PROCESSOR
- XC ALL VERBS IN THIS ROUTINE MUST BE INDEPENDANT
- XC OF OBJECT ACTIONS
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION SVERBS(RI)
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL MOVETO,YESNO
- X LOGICAL RMDESC
- X LOGICAL QOPEN
- X LOGICAL FINDXT,QHERE,F
- X INTEGER JOKES(25)
- X CHARACTER ANSSTR(78)
- X CHARACTER P1(6),P2(6),CH(6)
- X INTEGER ANSWER(28)
- X#include "parser.h"
- X#include "gamestate.h"
- X#include "state.h"
- X#include "screen.h"
- XC
- XC MISCELLANEOUS VARIABLES
- XC
- X CHARACTER VEDIT
- X COMMON /VERS/ VMAJ,VMIN,VEDIT
- X#include "io.h"
- X#include "rooms.h"
- X#include "rflag.h"
- X#include "rindex.h"
- X#include "exits.h"
- X#include "curxt.h"
- X#include "xpars.h"
- X#include "xsrch.h"
- X#include "objects.h"
- X#include "oflags.h"
- X#include "oindex.h"
- X#include "clock.h"
- X
- X#include "advers.h"
- X#include "verbs.h"
- X#include "flags.h"
- XC
- XC FUNCTIONS AND DATA
- XC
- X QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
- X DATA MXNOP/39/,MXJOKE/64/
- X DATA JOKES/4,5,3,304,305,306,307,308,309,310,311,312,
- X& 313,5314,5319,324,325,883,884,120,120,0,0,0,0/
- X DATA ANSWER/0,6,1,6,2,5,3,5,4,3,4,6,4,6,4,5,
- X& 5,5,5,4,5,6,6,10,7,4,7,6/
- X DATA ANSSTR/'T','E','M','P','L','E',
- X& 'F','O','R','E','S','T',
- X& '3','0','0','0','3',
- X& 'F','L','A','S','K',
- X& 'R','U','B',
- X& 'F','O','N','D','L','E',
- X& 'C','A','R','R','E','S',
- X& 'T','O','U','C','H',
- X& 'B','O','N','E','S',
- X& 'B','O','D','Y',
- X& 'S','K','E','L','E','T',
- X& 'R','U','S','T','Y','K','N','I','F','E',
- X& 'N','O','N','E',
- X& 'N','O','W','H','E','R','\0'/
- XC SVERBS, PAGE 2
- XC
- X SVERBS=.TRUE.
- XC !ASSUME WINS.
- X IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
- XC !SET UP DESCRIPTORS.
- X IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
- XC
- X IF(RI.EQ.0) CALL BUG(7,RI)
- XC !ZERO IS VERBOTEN.
- X IF(RI.LE.MXNOP) RETURN
- XC !NOP?
- X IF(RI.LE.MXJOKE) GO TO 100
- XC !JOKE?
- X GO TO (65000,66000,67000,68000,69000,
- X& 1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,
- X& 11000,12000,13000,14000,15000,16000,17000,18000,19000,20000,
- X& 21000,22000,23000,24000,25000,26000,27000),
- X& (RI-MXJOKE)
- X CALL BUG(7,RI)
- XC
- XC ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
- XC
- X10 SVERBS=.FALSE.
- XC !LOSE.
- X RETURN
- XC
- XC JOKE PROCESSOR.
- XC FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT.
- XC
- X100 I=JOKES(RI-MXNOP)
- XC !GET TABLE ENTRY.
- X J=I/1000
- XC !ISOLATE # STRINGS.
- X IF(J.NE.0) I=MOD(I,1000)+RND(J)
- XC !IF RANDOM, CHOOSE.
- X CALL RSPEAK(I)
- XC !PRINT JOKE.
- X RETURN
- XC SVERBS, PAGE 2A
- XC
- XC V65-- ROOM
- XC
- X65000 SVERBS=RMDESC(2)
- XC !DESCRIBE ROOM ONLY.
- X RETURN
- XC
- XC V66-- OBJECTS
- XC
- X66000 SVERBS=RMDESC(1)
- XC !DESCRIBE OBJ ONLY.
- X IF(.NOT.TELFLG) CALL RSPEAK(138)
- XC !NO OBJECTS.
- X RETURN
- XC
- XC V67-- RNAME
- XC
- X67000 CALL RSPEAK(RDESC2-HERE)
- XC !SHORT ROOM NAME.
- X RETURN
- XC
- XC V68-- RESERVED
- XC
- X68000 RETURN
- XC
- XC V69-- RESERVED
- XC
- X69000 RETURN
- XC SVERBS, PAGE 3
- XC
- XC V70-- BRIEF. SET FLAG.
- XC
- X1000 BRIEFF=.TRUE.
- XC !BRIEF DESCRIPTIONS.
- X SUPERF=.FALSE.
- X CALL RSPEAK(326)
- X RETURN
- XC
- XC V71-- VERBOSE. CLEAR FLAGS.
- XC
- X2000 BRIEFF=.FALSE.
- XC !LONG DESCRIPTIONS.
- X SUPERF=.FALSE.
- X CALL RSPEAK(327)
- X RETURN
- XC
- XC V72-- SUPERBRIEF. SET FLAG.
- XC
- X3000 SUPERF=.TRUE.
- X CALL RSPEAK(328)
- X RETURN
- XC
- XC V73-- STAY (USED IN ENDGAME).
- XC
- X4000 IF(WINNER.NE.AMASTR) GO TO 4100
- XC !TELL MASTER, STAY.
- X CALL RSPEAK(781)
- XC !HE DOES.
- X CTICK(CEVFOL)=0
- XC !NOT FOLLOWING.
- X RETURN
- XC
- X4100 IF(WINNER.EQ.PLAYER) CALL RSPEAK(664)
- XC !JOKE.
- X RETURN
- XC
- XC V74-- VERSION. PRINT INFO.
- XC
- X#ifdef PDP
- X5000 call prvers(vmaj,vmin,vedit)
- X#else
- X5000 WRITE(OUTCH,5010) VMAJ,VMIN,VEDIT
- X5010 FORMAT(' V',I1,'.',I2,A1)
- X#endif PDP
- X TELFLG=.TRUE.
- X RETURN
- XC
- XC V75-- SWIM. ALWAYS A JOKE.
- XC
- X6000 I=330
- XC !ASSUME WATER.
- X IF(and(RFLAG(HERE),(RWATER+RFILL)).EQ.0)
- X& I=331+RND(3)
- X CALL RSPEAK(I)
- X RETURN
- XC
- XC V76-- GERONIMO. IF IN BARREL, FATAL, ELSE JOKE.
- XC
- X7000 IF(HERE.EQ.MBARR) GO TO 7100
- XC !IN BARREL?
- X CALL RSPEAK(334)
- XC !NO, JOKE.
- X RETURN
- XC
- X7100 CALL JIGSUP(335)
- XC !OVER FALLS.
- X RETURN
- XC
- XC V77-- SINBAD ET AL. CHASE CYCLOPS, ELSE JOKE.
- XC
- X8000 IF((HERE.EQ.MCYCL).AND.QHERE(CYCLO,HERE)) GO TO 8100
- X CALL RSPEAK(336)
- XC !NOT HERE, JOKE.
- X RETURN
- XC
- X8100 CALL NEWSTA(CYCLO,337,0,0,0)
- XC !CYCLOPS FLEES.
- X CYCLOF=.TRUE.
- XC !SET ALL FLAGS.
- X MAGICF=.TRUE.
- X OFLAG2(CYCLO)=and(OFLAG2(CYCLO), not(FITEBT))
- X RETURN
- XC
- XC V78-- WELL. OPEN DOOR, ELSE JOKE.
- XC
- X9000 IF(RIDDLF.OR.(HERE.NE.RIDDL)) GO TO 9100
- XC !IN RIDDLE ROOM?
- X RIDDLF=.TRUE.
- XC !YES, SOLVED IT.
- X CALL RSPEAK(338)
- X RETURN
- XC
- X9100 CALL RSPEAK(339)
- XC !WELL, WHAT?
- X RETURN
- XC
- XC V79-- PRAY. IF IN TEMP2, POOF
- XC !
- XC
- X10000 IF(HERE.NE.TEMP2) GO TO 10050
- XC !IN TEMPLE?
- X IF(MOVETO(FORE1,WINNER)) GO TO 10100
- XC !FORE1 STILL THERE?
- X10050 CALL RSPEAK(340)
- XC !JOKE.
- X RETURN
- XC
- X10100 F=RMDESC(3)
- XC !MOVED, DESCRIBE.
- X RETURN
- XC
- XC V80-- TREASURE. IF IN TEMP1, POOF
- XC !
- XC
- X11000 IF(HERE.NE.TEMP1) GO TO 11050
- XC !IN TEMPLE?
- X IF(MOVETO(TREAS,WINNER)) GO TO 10100
- XC !TREASURE ROOM THERE?
- X11050 CALL RSPEAK(341)
- XC !NOTHING HAPPENS.
- X RETURN
- XC
- XC V81-- TEMPLE. IF IN TREAS, POOF
- XC !
- XC
- X12000 IF(HERE.NE.TREAS) GO TO 12050
- XC !IN TREASURE?
- X IF(MOVETO(TEMP1,WINNER)) GO TO 10100
- XC !TEMP1 STILL THERE?
- X12050 CALL RSPEAK(341)
- XC !NOTHING HAPPENS.
- X RETURN
- XC
- XC V82-- BLAST. USUALLY A JOKE.
- XC
- X13000 I=342
- XC !DONT UNDERSTAND.
- X IF(PRSO.EQ.SAFE) I=252
- XC !JOKE FOR SAFE.
- X CALL RSPEAK(I)
- X RETURN
- XC
- XC V83-- SCORE. PRINT SCORE.
- XC
- X14000 CALL SCORE(.FALSE.)
- X RETURN
- XC
- XC V84-- QUIT. FINISH OUT THE GAME.
- XC
- X15000 CALL SCORE(.TRUE.)
- XC !TELLL SCORE.
- X IF(.NOT.YESNO(343,0,0)) RETURN
- XC !ASK FOR Y/N DECISION.
- X#ifdef PDP
- XC close routine moved to exit for pdp version
- X#else
- X CLOSE (DBCH)
- X#endif PDP
- X CALL EXIT
- XC !BYE.
- XC SVERBS, PAGE 4
- XC
- XC V85-- FOLLOW (USED IN ENDGAME)
- XC
- X16000 IF(WINNER.NE.AMASTR) RETURN
- XC !TELL MASTER, FOLLOW.
- X CALL RSPEAK(782)
- X CTICK(CEVFOL)=-1
- XC !STARTS FOLLOWING.
- X RETURN
- XC
- XC V86-- WALK THROUGH
- XC
- X17000 IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND.
- X& ((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 17100
- X SCOLAC=SCOLRM
- XC !WALKED THRU SCOL.
- X PRSO=0
- XC !FAKE OUT FROMDR.
- X CTICK(CEVSCL)=6
- XC !START ALARM.
- X CALL RSPEAK(668)
- XC !DISORIENT HIM.
- X F=MOVETO(SCOLRM,WINNER)
- XC !INTO ROOM.
- X F=RMDESC(3)
- XC !DESCRIBE.
- X RETURN
- XC
- X17100 IF(HERE.NE.SCOLAC) GO TO 17300
- XC !ON OTHER SIDE OF SCOL?
- X DO 17200 I=1,12,3
- XC !WALK THRU PROPER WALL?
- X IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO))
- X& GO TO 17500
- X17200 CONTINUE
- XC
- X17300 IF(and(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 17400
- X I=669
- XC !NO, JOKE.
- X IF(PRSO.EQ.SCOL) I=670
- XC !SPECIAL JOKE FOR SCOL.
- X CALL RSPSUB(I,ODO2)
- X RETURN
- XC
- X17400 I=671
- XC !JOKE.
- X IF(OROOM(PRSO).NE.0) I=552+RND(5)
- XC !SPECIAL JOKES IF CARRY.
- X CALL RSPEAK(I)
- X RETURN
- XC
- X17500 PRSO=SCOLWL(I+2)
- XC !THRU SCOL WALL...
- X DO 17600 I=1,8,2
- XC !FIND MATCHING ROOM.
- X IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
- X17600 CONTINUE
- XC !DECLARE NEW SCOLRM.
- X CTICK(CEVSCL)=0
- XC !CANCEL ALARM.
- X CALL RSPEAK(668)
- XC !DISORIENT HIM.
- X F=MOVETO(BKBOX,WINNER)
- XC !BACK IN BOX ROOM.
- X F=RMDESC(3)
- X RETURN
- XC
- XC V87-- RING. A JOKE.
- XC
- X18000 I=359
- XC !CANT RING.
- X IF(PRSO.EQ.BELL) I=360
- XC !DING, DONG.
- X CALL RSPEAK(I)
- XC !JOKE.
- X RETURN
- XC
- XC V88-- BRUSH. JOKE WITH OBSCURE TRAP.
- XC
- X19000 IF(PRSO.EQ.TEETH) GO TO 19100
- XC !BRUSH TEETH?
- X CALL RSPEAK(362)
- XC !NO, JOKE.
- X RETURN
- XC
- X19100 IF(PRSI.NE.0) GO TO 19200
- XC !WITH SOMETHING?
- X CALL RSPEAK(363)
- XC !NO, JOKE.
- X RETURN
- XC
- X19200 IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER))
- X& GO TO 19300
- X CALL RSPSUB(364,ODI2)
- XC !NO, JOKE.
- X RETURN
- XC
- X19300 CALL JIGSUP(365)
- XC !YES, DEAD
- XC !
- XC !
- XC !
- XC !
- XC !
- X RETURN
- XC SVERBS, PAGE 5
- XC
- XC V89-- DIG. UNLESS SHOVEL, A JOKE.
- XC
- X20000 IF(PRSO.EQ.SHOVE) RETURN
- XC !SHOVEL?
- X I=392
- XC !ASSUME TOOL.
- X IF(and(OFLAG1(PRSO),TOOLBT).EQ.0) I=393
- X CALL RSPSUB(I,ODO2)
- X RETURN
- XC
- XC V90-- TIME. PRINT OUT DURATION OF GAME.
- XC
- X#ifdef PDP
- XC no duration time available for pdp version (removed
- XC to make things fit)
- X21000 TELFLG=.TRUE.
- X RETURN
- X#else
- X21000 CALL GTTIME(K)
- XC !GET PLAY TIME.
- X I=K/60
- X J=MOD(K,60)
- XC
- X WRITE(OUTCH,21010)
- X IF(I.NE.0) WRITE(OUTCH,21011) I
- X IF(I.GE.2) WRITE(OUTCH,21012)
- X IF(I.EQ.1) WRITE(OUTCH,21013)
- X IF(J.EQ.1) WRITE(OUTCH,21014) J
- X IF(J.NE.1) WRITE(OUTCH,21015) J
- X TELFLG=.TRUE.
- X RETURN
- XC
- X21010 FORMAT(' You have been playing Dungeon for ',$)
- X21011 FORMAT('+',I3,' hour',$)
- X21012 FORMAT('+s and ',$)
- X21013 FORMAT('+ and ',$)
- X21014 FORMAT('+',I2,' minute.')
- X21015 FORMAT('+',I2,' minutes.')
- X#endif PDP
- XC
- XC V91-- LEAP. USUALLY A JOKE, WITH A CATCH.
- XC
- X22000 IF(PRSO.EQ.0) GO TO 22200
- XC !OVER SOMETHING?
- X IF(QHERE(PRSO,HERE)) GO TO 22100
- XC !HERE?
- X CALL RSPEAK(447)
- XC !NO, JOKE.
- X RETURN
- XC
- X22100 IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 22300
- X CALL RSPSUB(448,ODO2)
- XC !CANT JUMP VILLAIN.
- X RETURN
- XC
- X22200 IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 22300
- XC !DOWN EXIT?
- X IF((XTYPE.EQ.XNO).OR.((XTYPE.EQ.XCOND).AND.
- X& .NOT.FLAGS(XFLAG))) GO TO 22400
- X22300 CALL RSPEAK(314+RND(5))
- XC !WHEEEE
- XC !
- X RETURN
- XC
- X22400 CALL JIGSUP(449+RND(4))
- XC !FATAL LEAP.
- X RETURN
- XC SVERBS, PAGE 6
- XC
- XC V92-- LOCK.
- XC
- X23000 IF((PRSO.EQ.GRATE).AND.(HERE.EQ.MGRAT))
- X& GO TO 23200
- X23100 CALL RSPEAK(464)
- XC !NOT LOCK GRATE.
- X RETURN
- XC
- X23200 GRUNLF=.FALSE.
- XC !GRATE NOW LOCKED.
- X CALL RSPEAK(214)
- X TRAVEL(REXIT(HERE)+1)=214
- XC !CHANGE EXIT STATUS.
- X RETURN
- XC
- XC V93-- UNLOCK
- XC
- X24000 IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT))
- X& GO TO 23100
- X IF(PRSI.EQ.KEYS) GO TO 24200
- XC !GOT KEYS?
- X CALL RSPSUB(465,ODI2)
- XC !NO, JOKE.
- X RETURN
- XC
- X24200 GRUNLF=.TRUE.
- XC !UNLOCK GRATE.
- X CALL RSPEAK(217)
- X TRAVEL(REXIT(HERE)+1)=217
- XC !CHANGE EXIT STATUS.
- X RETURN
- XC
- XC V94-- DIAGNOSE.
- XC
- X25000 I=FIGHTS(WINNER,.FALSE.)
- XC !GET FIGHTS STRENGTH.
- X J=ASTREN(WINNER)
- XC !GET HEALTH.
- X K=MIN0(I+J,4)
- XC !GET STATE.
- X IF(.NOT.CFLAG(CEVCUR)) J=0
- XC !IF NO WOUNDS.
- X L=MIN0(4,IABS(J))
- XC !SCALE.
- X CALL RSPEAK(473+L)
- XC !DESCRIBE HEALTH.
- X I=(30*(-J-1))+CTICK(CEVCUR)
- XC !COMPUTE WAIT.
- XC
- X#ifdef PDP
- X if(J .ne. 0) call cured(I)
- X#else
- X IF(J.NE.0) WRITE(OUTCH,25100) I
- X25100 FORMAT(' You will be cured after ',I3,' moves.')
- X#endif PDP
- XC
- X CALL RSPEAK(478+K)
- XC !HOW MUCH MORE?
- X IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS)
- XC !HOW MANY DEATHS?
- X RETURN
- XC SVERBS, PAGE 7
- XC
- XC V95-- INCANT
- XC
- X26000 DO 26100 I=1,6
- XC !SET UP PARSE.
- X P1(I)=' '
- X P2(I)=' '
- X26100 CONTINUE
- X WP=1
- XC !WORD POINTER.
- X CP=1
- XC !CHAR POINTER.
- X IF(PRSCON.LE.1) GO TO 26300
- X DO 26200 I=PRSCON,INLNT
- XC !PARSE INPUT
- X IF(INBUF(I).EQ.',') GO TO 26300
- XC !END OF PHRASE?
- X IF(INBUF(I).NE.' ') GO TO 26150
- XC !SPACE?
- X IF(CP.NE.1) WP=WP+1
- X CP=1
- X GO TO 26200
- X26150 IF(WP.EQ.1) P1(CP)=INBUF(I)
- XC !STUFF INTO HOLDER.
- X IF(WP.EQ.2) P2(CP)=INBUF(I)
- X CP=MIN0(CP+1,6)
- X26200 CONTINUE
- XC
- X26300 PRSCON=1
- XC !KILL REST OF LINE.
- X IF(P1(1).NE.' ') GO TO 26400
- XC !ANY INPUT?
- X CALL RSPEAK(856)
- XC !NO, HO HUM.
- X RETURN
- XC
- X26400 CALL ENCRYP(P1,CH)
- XC !COMPUTE RESPONSE.
- X IF(P2(1).NE.' ') GO TO 26600
- XC !TWO PHRASES?
- XC
- X IF(SPELLF) GO TO 26550
- XC !HE'S TRYING TO LEARN.
- X IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 26575
- X SPELLF=.TRUE.
- XC !TELL HIM.
- X TELFLG=.TRUE.
- X#ifdef PDP
- X call voice(P1,CH)
- X#else
- X WRITE(OUTCH,26510) P1,CH
- X26510 FORMAT(' A hollow voice replies: "',6A1,1X,6A1,'".')
- X#endif PDP
- XC
- X RETURN
- XC
- X26550 CALL RSPEAK(857)
- XC !HE'S GOT ONE ALREADY.
- X RETURN
- XC
- X26575 CALL RSPEAK(858)
- XC !HE'S NOT IN ENDGAME.
- X RETURN
- XC
- X26600 IF(and(RFLAG(TSTRS),RSEEN).NE.0) GO TO 26800
- X DO 26700 I=1,6
- X IF(P2(I).NE.CH(I)) GO TO 26575
- XC !WRONG.
- X26700 CONTINUE
- X SPELLF=.TRUE.
- XC !IT WORKS.
- X CALL RSPEAK(859)
- X CTICK(CEVSTE)=1
- XC !FORCE START.
- X RETURN
- XC
- X26800 CALL RSPEAK(855)
- XC !TOO LATE.
- X RETURN
- XC SVERBS, PAGE 8
- XC
- XC V96-- ANSWER
- XC
- X27000 IF((PRSCON.GT.1).AND.
- X& (HERE.EQ.FDOOR).AND.INQSTF)
- X& GO TO 27100
- X CALL RSPEAK(799)
- XC !NO ONE LISTENS.
- X PRSCON=1
- X RETURN
- XC
- X27100 K=1
- XC !POINTER INTO ANSSTR.
- X DO 27300 J=1,28,2
- XC !CHECK ANSWERS.
- X NEWK=K+ANSWER(J+1)
- XC !COMPUTE NEXT K.
- X IF(QUESNO.NE.ANSWER(J)) GO TO 27300
- XC !ONLY CHECK PROPER ANS.
- X I=PRSCON-1
- XC !SCAN ANSWER.
- X DO 27200 L=K,NEWK-1
- X27150 I=I+1
- XC !SKIP INPUT BLANKS.
- X IF(I.GT.INLNT) GO TO 27300
- XC !END OF INPUT? LOSE.
- X IF(INBUF(I).EQ.' ') GO TO 27150
- X IF(INBUF(I).NE.ANSSTR(L)) GO TO 27300
- X27200 CONTINUE
- X GO TO 27500
- XC !RIGHT ANSWER.
- X27300 K=NEWK
- XC
- X PRSCON=1
- XC !KILL REST OF LINE.
- X NQATT=NQATT+1
- XC !WRONG, CRETIN.
- X IF(NQATT.GE.5) GO TO 27400
- XC !TOO MANY WRONG?
- X CALL RSPEAK(800+NQATT)
- XC !NO, TRY AGAIN.
- X RETURN
- XC
- X27400 CALL RSPEAK(826)
- XC !ALL OVER.
- X CFLAG(CEVINQ)=.FALSE.
- XC !LOSE.
- X RETURN
- XC
- X27500 PRSCON=1
- XC !KILL REST OF LINE.
- X CORRCT=CORRCT+1
- XC !GOT IT RIGHT.
- X CALL RSPEAK(800)
- XC !HOORAY.
- X IF(CORRCT.GE.3) GO TO 27600
- XC !WON TOTALLY?
- X CTICK(CEVINQ)=2
- XC !NO, START AGAIN.
- X QUESNO=MOD(QUESNO+3,8)
- X NQATT=0
- X CALL RSPEAK(769)
- XC !ASK NEXT QUESTION.
- X CALL RSPEAK(770+QUESNO)
- X RETURN
- XC
- X27600 CALL RSPEAK(827)
- XC !QUIZ OVER,
- X CFLAG(CEVINQ)=.FALSE.
- X OFLAG2(QDOOR)=or(OFLAG2(QDOOR),OPENBT)
- X RETURN
- XC
- X END
- END_OF_sverbs.F
- if test 13200 -ne `wc -c <sverbs.F`; then
- echo shar: \"sverbs.F\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- echo shar: End of archive 4 \(of 7\).
- cp /dev/null ark4isdone
- MISSING=""
- for I in 1 2 3 4 5 6 7 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 7 archives.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-